package ru.javadevelop.vegetarian.background;

import android.content.Context;
import ru.javadevelop.vegetarian.R;
import ru.javadevelop.vegetarian.common.AppPreferences;
import ru.javadevelop.vegetarian.common.ExtApplication;
import ru.javadevelop.vegetarian.model.Category;
import ru.javadevelop.vegetarian.model.Favorite;
import ru.javadevelop.vegetarian.model.Image;
import ru.javadevelop.vegetarian.model.Recipe;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

public class Syncer {
    private Context _context;
    private ArrayList<Recipe> remoteRecipes;
    public Syncer (Context context)
    {
        this._context = context;
    }
    //******************************************************************************************************************
    public void syncCategories()
    {
        // получаем категории из web-сервиса
        JsonGetter jsonGetter = new JsonGetter(_context);
        ArrayList<Category> categories = jsonGetter.getCategories();
        // тут у нас будут храниться id категорий из web-сервиса
        // Проходим по всем категориям и сохраняем их локально, добавляя
        // с список с id все полученные id категорий
        for (Category cat:categories)
        {
            try {
                cat.save();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        // теперь нужно сравнить локальные категории и те, что только что пришли. Если локальных категорий
        // больше, — нужно удалить лишние
        ArrayList<Category> localCategories = Category.getAll();
        if (categories.size()!=localCategories.size())
        {

            for (Category localCategory : localCategories) {
                if (!categories.contains(localCategory))
                {
                    localCategory.delete();
                }
            }
        }
    }
    //******************************************************************************************************************

    public void syncRecipes()
    {
        JsonGetter jsonGetter = new JsonGetter(_context);
        Long longDate = Long.parseLong(AppPreferences.LAST_SYNC_DATE.toStr());
        if (longDate==null)
        {
            longDate = 0l;
        }
        Date date = new Date(longDate);
        remoteRecipes = jsonGetter.getRecipesFromDate(date);
        // Проходим по всем рецептам и сохраняем их локально, добавляя
        // с список с id все полученные id категорий
        for (Recipe recipe:remoteRecipes)
        {
            try {
                recipe.save();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }

    }
    //******************************************************************************************************************
    public void syncImages() throws Exception {
        // На момент вызова синхронизации картинок уже должна была быть
        // вызвана синхронизация рецептов
        if (remoteRecipes==null)
            throw new Exception("Нужно сначала вызвать syncRecipes()");

        JsonGetter jsonGetter = new JsonGetter(_context);
        String imagesUrl = _context.getString(R.string.imagesAddress);
        ImageGetter imageGetter = new ImageGetter(_context, imagesUrl);
        ArrayList<Image> images = new ArrayList<Image>();
        ArrayList<Image> oldimagesForRecipe;

        for (Recipe recipe: remoteRecipes)
        {
            // берем старые картинки, которые уже были у рецепта
            oldimagesForRecipe =  recipe.getImages();
            // и берем картинки, которые на сервере у рецепта
            ArrayList<Image> newImagesForRecipe = jsonGetter.getImagesForRecipe(recipe.id);
            for (Image oldImg : oldimagesForRecipe)
            {
                if (!newImagesForRecipe.contains(oldImg))
                {
                    oldImg.delete(_context);
                }
            }
            images.addAll(newImagesForRecipe);

        }
        for (Image image: images)
        {
            image.save();
            imageGetter.getImage(image.id);
        }

    }
    //******************************************************************************************************************
    private InputStream OpenHttpConnection(String urlString) throws IOException
    {
        InputStream in = null;
        int response = -1;

        URL url = new URL(urlString);
        URLConnection conn = url.openConnection();

        if (!(conn instanceof HttpURLConnection)) throw new IOException("Not an HTTP connection");

        try{
            HttpURLConnection httpConn = (HttpURLConnection) conn;
            httpConn.setAllowUserInteraction(false);
            httpConn.setInstanceFollowRedirects(true);
            httpConn.setRequestMethod("GET");
            httpConn.connect();

            response = httpConn.getResponseCode();
            if (response == HttpURLConnection.HTTP_OK) {
                in = httpConn.getInputStream();
            }
        }
        catch (Exception ex)
        {
            throw new IOException("Error connecting");
        }
        return in;
    }
    //******************************************************************************************************************

    /**
     * Синхронизация любимых блюд
     */
    public  void syncFavorites()
    {
         ArrayList<Favorite> favorites = Favorite.getAllForUser(ExtApplication.Session.googleAccount);
         JsonGetter jsonGetter = new JsonGetter(_context);
        // Если избранные блюда не были пустыми, — отправляем их всех на сервер
        if (!favorites.isEmpty())
         {
             for (Favorite fav : favorites)
             {
                 jsonGetter.putFavoriteToServer(ExtApplication.Session.googleAccount, fav.recipeId);
             }
             jsonGetter.deleteOldFavForUser(ExtApplication.Session.googleAccount);
         }
         // получаем все избранные блюда и перезаписываем их локально
         favorites =  jsonGetter.getFavoritesForUser(ExtApplication.Session.googleAccount);
         if ((favorites!=null)&&(favorites.size()>0))
         {
             Favorite.deleteAll();
             for (Favorite fav : favorites)
             {
                 try {
                     if (Favorite.get(fav.username, fav.recipeId)==null)
                     {
                         fav.save();
                     }
                 } catch (SQLException e) {
                     throw new RuntimeException(e);
                 }
             }
         }

    }
    //******************************************************************************************************************
}
